package String.easy;

/**
 * 1. 问题描述
 *      字符串压缩。利用字符重复出现的次数，编写一种方法，实现基本的字符串压缩功能。
 *      比如，字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短，则返
 *      回原先的字符串。你可以假设字符串中只包含大小写英文字母（a至z）。
 *
 *
 * 2. 算法分析
 *      采用模拟法。ch为初始字符，cnt为当前初始字符出现的次数
 *      扫描字符串，当遇到的字符与当前字符ch一样，让cnt自增，
 *      直到遇到第一个与ch不同的字符，将ch和cnt添加到一个新的
 *      字符串中，更新ch为当前遇到的字符，cnt重置为1，重复执行
 *
 * 3.具体代码
 */



public class 字符串压缩 {
    public static void main(String[] args) {
        System.out.println(test01("aabbbcccaa"));
    }

    /**
     *
     * 注意：下面的代码虽然可以压缩字符串，但是改变了字符串中的字符的出现次序
     * 举个例子：aabbccaa---->a2b2c2a2
     * 但是按照下面我写的代码出现的是a4b2c2
     * 所以不对
     * @param S
     * @return
     */
    public static String compressString(String S) {
        if (S.length() == 0) {
            return "";
        }
        StringBuilder builder = new StringBuilder();
        char ch = S.charAt(0);
        int cnt = 1;
        for (int i = 1; i < S.length(); i++) {
            if (S.charAt(i) == ch) {
                cnt++;
            } else {
                builder.append(ch);
                builder.append(cnt);
                ch = S.charAt(i);
                cnt = 1;
            }
        }
        // 为什么最后还需要添加一次?
        builder.append(ch);
        builder.append(cnt);
        return (builder.toString().length() < S.length()) ? builder.toString() : S;
    }

    // 考虑最简单的一次扫描法
    public static String test(String s) {
        StringBuilder builder = new StringBuilder();
        for (int j = 0; j < s.length(); j++) {
            builder.append(s.charAt(j));
            int count = 1; // 计数器
            for (int k = j+1; k < s.length(); k++) {
                if (s.charAt(k) == s.charAt(j)) {
                    count++;
                } else {
                    j = k-1;
                    builder.append(count);
                    break;
                }
            }
        }
        return builder.toString();
    }

    public static String test01(String S) {
        if (S.length() == 0) {
            return null;
        }
        StringBuilder builder = new StringBuilder();
        char ch = S.charAt(0);
        int cnt = 1;
        for (int i = 1; i < S.length(); i++) {
            if (S.charAt(i) == ch) {
                cnt++;
            } else {
                builder.append(ch);
                builder.append(cnt);
                ch = S.charAt(i);
                cnt = 1;
            }
        }
        // 为什么最后还需要添加一次?
        builder.append(ch);
        builder.append(cnt);
        return builder.toString();
    }
}
